#include "gpio.h"

// Pin definitions for PWM enable signals
#define PWM_EN_U_PIN GPIO_PIN_13  // U phase PWM enable on PB13
#define PWM_EN_V_PIN GPIO_PIN_14  // V phase PWM enable on PB14 
#define PWM_EN_W_PIN GPIO_PIN_15  // W phase PWM enable on PB15
#define PWM_EN_PORT GPIOB         // All pins are on GPIOB

void GPIO_PWM_EN_Init(void)
{
    // Enable GPIOB clock
    __HAL_RCC_GPIOB_CLK_ENABLE();  // Enable clock for port B

    // Configure GPIO pins
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = PWM_EN_U_PIN | PWM_EN_V_PIN | PWM_EN_W_PIN;  // Configure PB13,14,15
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;    // Push-pull output
    GPIO_InitStruct.Pull = GPIO_NOPULL;           // No pull-up/pull-down
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  // Low speed is sufficient
    HAL_GPIO_Init(PWM_EN_PORT, &GPIO_InitStruct);

    // Set initial state to low (disabled)
    GPIO_PWM_EN_SetLow();  // Initialize all outputs to low
}

void GPIO_PWM_EN_SetHigh(void)
{
    HAL_GPIO_WritePin(PWM_EN_PORT, PWM_EN_U_PIN, GPIO_PIN_SET);    // Enable U phase
    HAL_GPIO_WritePin(PWM_EN_PORT, PWM_EN_V_PIN, GPIO_PIN_SET);    // Enable V phase
    HAL_GPIO_WritePin(PWM_EN_PORT, PWM_EN_W_PIN, GPIO_PIN_SET);    // Enable W phase
}

void GPIO_PWM_EN_SetLow(void)
{
    HAL_GPIO_WritePin(PWM_EN_PORT, PWM_EN_U_PIN, GPIO_PIN_RESET);  // Disable U phase
    HAL_GPIO_WritePin(PWM_EN_PORT, PWM_EN_V_PIN, GPIO_PIN_RESET);  // Disable V phase
    HAL_GPIO_WritePin(PWM_EN_PORT, PWM_EN_W_PIN, GPIO_PIN_RESET);  // Disable W phase
}
